package com.boil.qz.safekavass.web.controller;

import com.boil.pojo.Page2Vo;
import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.pojo.ResourceParentVo;
import com.boil.qz.safekavass.pojo.ZTreeSimpleDataVo;
import com.boil.qz.safekavass.service.ResourceService;
import com.boil.qz.safekavass.web.request.param.IdParam;
import com.boil.qz.safekavass.web.request.param.ResourceAddParam;
import com.boil.qz.safekavass.web.request.param.ResourceListParam;
import com.boil.qz.safekavass.web.request.param.ResourceUpdateParam;
import com.boil.util.Constants;
import com.boil.util.OkBaseController;
import com.boil.util.Page2;
import com.boil.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ChenYong on 2017-07-11.
 * <br>
 * 资源 Controller。
 */
@Controller
@RequestMapping("/web/resource")
public class ResourceController extends OkBaseController {
    /**
     * 注入资源 Service
     */
    @Autowired
    private ResourceService resourceService;

    /**
     * 获取资源 zTree json。
     *
     * @param model  模型
     * @param param  父资源 <code>List</code> 的请求参数
     * @param errors 请求参数的校验结果
     * @return 父资源 <code>List</code> json
     */
    @RequestMapping("/ztree.json")
    @ResponseBody
    public ResultVo ztreeJson(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        List<Integer> resourceTypes = new ArrayList<Integer>();
        resourceTypes.add(Constants.VALUE_0);
        resourceTypes.add(Constants.VALUE_1);

        List<ZTreeSimpleDataVo> zTreeSimpleDataVos = resourceService.findZTree(param.getId(), resourceTypes);

        resultVo.setResults(zTreeSimpleDataVos);

        return resultVo;
    }

    /**
     * 添加资源页面。
     *
     * @param model 模型
     * @return 添加资源页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/add.html")
    public String addHtml(Model model) {
        return "/resource/add";
    }

    /**
     * 添加资源。
     *
     * @param model  模型
     * @param param  添加资源的请求参数
     * @param errors 请求参数的校验结果
     * @return 重定向到资源列表页面--->“redirect:/resource/list.html”
     */
    @RequestMapping(method = RequestMethod.POST, value = "/add.html")
    public String add(Model model, @Valid ResourceAddParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        resourceService.save(param);

        return "redirect:/web/resource/list.html";
    }

    /**
     * 资源列表页面。
     *
     * @param model 模型
     * @return 资源列表页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/list.html")
    public String listHtml(Model model) {
        return "/resource/list";
    }

    /**
     * 获取资源列表 json。
     *
     * @param model  模型
     * @param param  资源列表的请求参数
     * @param errors 请求参数的校验结果
     * @return 资源列表 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/list.json")
    @ResponseBody
    public ResultVo listJson(Model model, @Valid ResourceListParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        // 查询分页实例
        Page2<ResourceParentVo> page2 = Utils.getPage2(request, param, Constants.ID_STR);
        page2.getParams().put("resourceName", param.getResourceName());
        page2.getParams().put("parentName", param.getParentName());
        page2.getParams().put("resourceType", param.getResourceType());
        page2.getParams().put("permissionCode", param.getPermissionCode());
        page2.getParams().put("startDate", param.getStartDate());
        page2.getParams().put("endDate", param.getEndDate());

        // 分页查询
        resourceService.findInPage(page2);

        // 获取 DataTables 专用分页映射实例
        Page2Vo<ResourceParentVo> page2Vo = Utils.getPage2Vo(param, page2);

        resultVo.setResult(page2Vo);

        return resultVo;
    }

    /**
     * 更新资源页面。
     *
     * @param param ID 参数
     * @param model 模型
     * @return 更新资源页面
     */
    @RequestMapping(method = RequestMethod.GET, value = "/update.html")
    public String updateHtml(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        ResourceParentVo resourceParentVo = resourceService.findById(param.getId());

        resultVo.setResult(resourceParentVo);

        model.addAttribute(Constants.RESULT_VO, resultVo);

        return "/resource/update";
    }

    /**
     * 添加资源。
     *
     * @param model  模型
     * @param param  添加资源的请求参数
     * @param errors 请求参数的校验结果
     * @return 重定向到资源列表页面--->“redirect:/resource/list.html”
     */
    @RequestMapping(method = RequestMethod.POST, value = "/update.html")
    public String update(Model model, @Valid ResourceUpdateParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        resourceService.update(param);

        return "redirect:/web/resource/list.html";
    }

    /**
     * 删除资源 json。
     *
     * @param model  模型
     * @param param  ID 参数
     * @param errors 请求参数的校验结果
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/delete.json")
    @ResponseBody
    public ResultVo delete(Model model, @Valid IdParam param, BindingResult errors) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        // 判断请求参数是否校验通过
        Utils.hasRequestParamError(resultVo, errors);

        // 删除
        resourceService.deleteById(param.getId());

        resultVo.setResultMsg("删除资源成功");

        return resultVo;
    }

    /**
     * 验证权限代码是否存在。
     *
     * @param model          模型
     * @param permissionCode 权限代码
     * @return 结果 json
     */
    @RequestMapping(method = RequestMethod.GET, value = "/check/permission_code.json")
    @ResponseBody
    public ResultVo checkPermissionCode(Model model, String permissionCode) {
        // 结果 Vo
        ResultVo resultVo = new ResultVo();

        resourceService.checkPermissionCode(resultVo, permissionCode);

        return resultVo;
    }
}